package org.example.sword2offer.primary;

/**
 * @author: lynn
 * @Descript: 表示数值的字符串
 * 请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。
 * 例如，字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
 * 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
 * @date: 2021/3/23 20:08
 * @version: 1.0
 */
public class Q53_IsNumberic {

    public static void main(String[] args) {
        System.out.println(isNumeric("1+23"));
    }


    /**
     * 正负号只能出现在第一个位置或者e/E后一个位置
     * e/E后面有且必须有整数
     * 字符串中只能包含数字、小数点、正负号、e/E，其它的都是非法字符
     * e/E的前面最多只能出现一次小数点，而e/E的后面不能出现小数点
     *
     * 遍历:
     * 1.有 e|E  所以引入hasE
     *      1.1 e|E后面一定有数字
     *      1.2 不能同时存在两个e
     * 2.有 +|-   引入表示符号 symbol
     *      2.1 第二次出现+-符号，则必须紧接在e之后
     *      2.2 第一次出现+-符号，且不是在字符串开头，则也必须紧接在e之后
     * 3.有"."   引入decimal
     *      3.1 e后面不能接小数点，小数点不能出现两次
     * 4. 不合法字符
     *
     */
    private static boolean isNumeric (String str) {
        char[] strs=str.toCharArray();
        if (strs==null || strs.length==0){
            return false;
        }
        Boolean hasE=false,symbol=false,decimal=false;
        for (int i = 0; i <strs.length ; i++) {
            if (strs[i]=='e'||strs[i]=='E'){
                if (i==strs.length-1){ //e后面一定要接数字
                    return false;
                }
                if (hasE){
                    return false;
                }
                hasE=true;
            }else if (strs[i]=='+'||strs[i]=='-'){
                /*if (symbol ){
                    //必须紧跟在e之后
                    if (strs[i-1]!='e' && strs[i-1]!='E'){ // qie改成或了
                        return false;
                    }
                }else { //第一次出现符号位 且不是在字符串开头，则也必须紧接在e之后
                    if (strs[0]!='+' || strs[0]!='-'){
                        if (i>1&&strs[i-1]!='e' || strs[i-1]!='E'){
                            return false;
                        }
                    }*//*else{
                        if (i>1&&strs[i-1]!='e' && strs[i-1]!='E'){
                            return false;
                        }
                    }*//*
                }*/
                // 第二次出现+-符号，则必须紧接在e之后
                if (symbol && strs[i-1] != 'e' && strs[i-1] != 'E') {
                    return false;
                }
                // 第一次出现+-符号，且不是在字符串开头，则也必须紧接在e之后
                if (!symbol && i > 0 && strs[i-1] != 'e' && strs[i-1] != 'E') {
                    return false;
                }
                symbol=true;
            }else if (strs[i]=='.'){
                if ( decimal){
                    //小数点不能出现两次
                    return false;
                }
                // E|e 后面不能出现小数点
                if (strs[i-1]=='e'||strs[i-1]=='E'){
                    return false;
                }

                decimal=true;
            }
           else if (strs[i]>'9'||strs[i]<'0'){
                return false;
            }
        }
        return true;
    }
}
